package com.whatstodo.net;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.ArrayList;
import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
import com.whatstodo.WhatsToDo;
import com.whatstodo.activities.SyncSettingsActivity;
import com.whatstodo.dtos.ListDTO;
import com.whatstodo.manager.HistoryEventManager;
import com.whatstodo.manager.TodoListManager;
import com.whatstodo.models.HistoryEvent;
import com.whatstodo.models.List;
import com.whatstodo.net.request.SyncAllRequest;
import com.whatstodo.net.request.SyncTodoRequest;
public class ListSynchronizer {
private String baseURL = "http://10.0.2.2:8080/rest/list";
private String user = "Testuser";
private Gson gson = new GsonBuilder()
.excludeFieldsWithModifiers(Modifier.STATIC).serializeNulls()
.create();
public ListSynchronizer() {
SharedPreferences settings = WhatsToDo.getContext()
.getSharedPreferences(SyncSettingsActivity.PREFERENCES_NAME,
Context.MODE_PRIVATE);
user = settings.getString("Username", "Testuser");
String ip = settings.getString("IP", "10.0.2.2");
String port = settings.getString("Port", "8080");
baseURL = "http://" + ip + ":" + port + "/rest/list";
}
public boolean serverIsAvailble() {
String URL = baseURL + "/" + "serverinfo";
try {
HttpClient.sendHttpGet(URL);
return true;
} catch (Exception e) {
return false;
}
}
public List getList(long listId) throws SynchronizationException {
try {
String URL = baseURL + "/" + user + "/" + listId;
JsonElement receivedJson = HttpClient.sendHttpGet(URL);
List list = null;
if (!receivedJson.isJsonNull()) {
ListDTO dto = gson.fromJson(receivedJson, ListDTO.class);
list = List.fromDTO(dto);
}
return list;
} catch (Exception e) {
throw new SynchronizationException(e);
}
}
public void saveList(List list) throws SynchronizationException {
try {
String jsonString = gson.toJson(list);
String URL = baseURL + "/" + user + "/" + list.getId();
HttpClient.sendHttpPut(URL, jsonString);
} catch (SynchronizationException e) {
throw new SynchronizationException(e);
}
}
public void deleteList(List list) throws SynchronizationException {
try {
String URL = baseURL + "/" + user + "/" + list.getId();
HttpClient.sendHttpDelete(URL);
} catch (Exception e) {
throw new SynchronizationException(e);
}
}
public List synchronizeList(List list) throws SynchronizationException {
try {
// Find all events for the todo
java.util.List<HistoryEvent> todoHistory = HistoryEventManager
.getInstance().find(null, null, null, list.getId(), null,
false);
// Find all events for the tasks
java.util.List<HistoryEvent> taskHistory = HistoryEventManager
.getInstance().find(null, null, null, null, list.getId(),
false);
java.util.List<HistoryEvent> history = todoHistory;
history.addAll(taskHistory);
SyncTodoRequest todoRequest = new SyncTodoRequest();
todoRequest.setTodo(List.toDTO(list));
todoRequest.setHistory(history);
String json = gson.toJson(todoRequest);
String URL = baseURL + "/sync" + "/" + user + "/" + list.getId();
JsonElement receivedJson = HttpClient.sendHttpPost(URL, json);
List synchronizedList = null;
if (!receivedJson.isJsonNull()) {
ListDTO dto = gson.fromJson(receivedJson, ListDTO.class);
synchronizedList = List.fromDTO(dto);
}
updateHistory(history);
return synchronizedList;
} catch (Exception e) {
throw new SynchronizationException(e);
}
}
public java.util.List<List> synchronizeAll()
throws SynchronizationException {
try {
java.util.List<HistoryEvent> history = HistoryEventManager
.getInstance().find(null, null, null, null, null, false);
java.util.List<List> all = TodoListManager.getInstance().findAll();
java.util.List<ListDTO> todos = new ArrayList<ListDTO>();
for (List list : all) {
// eager load every list
list = TodoListManager.getInstance().load(list.getId(), true);
todos.add(List.toDTO(list));
}
SyncAllRequest request = new SyncAllRequest();
request.setHistory(history);
request.setTodos(todos);
String json = gson.toJson(request);
String URL = baseURL + "/sync" + "/" + user;
JsonElement receivedJson = HttpClient.sendHttpPost(URL, json);
java.util.List<List> synchronizedTodos = new ArrayList<List>();
if (!receivedJson.isJsonNull()) {
Type typeOfT = new TypeToken<java.util.List<ListDTO>>() {
}.getType();
java.util.List<ListDTO> dtos = gson.fromJson(receivedJson,
typeOfT);
for (ListDTO dto : dtos) {
synchronizedTodos.add(List.fromDTO(dto));
}
}
updateHistory(history);
return synchronizedTodos;
} catch (Exception e) {
throw new SynchronizationException(e);
}
}
private void updateHistory(java.util.List<HistoryEvent> history) {
for (HistoryEvent event : history) {
event.setSynchronized(true);
HistoryEventManager.getInstance().save(event);
}
}
}